package org.patterns.behavior.state;


/**
 * 银行账户环境类，负责管理账户状态和资金操作
 * 通过状态模式实现不同账户状态下的行为差异
 */
public class Account {
    // 维持一个对抽象状态对象的引用
    private AccountState state;
    // 账户持有人姓名
    private String owner;
    // 当前账户余额（单位：元）
    private double balance = 0;

    /**
     * 账户构造函数
     * @param owner 账户持有人姓名（不可为空）
     * @param balance 初始账户余额（单位：元）
     */
    public Account(String owner, double balance) {
        this.owner = owner;
        this.balance = balance;
        // 初始化账户状态为普通状态
        this.state = new NormalState(this);
        System.out.println(this.owner + "开户，初始金额为" + balance);
        System.out.println("---------------------------------------------");
    }

    /**
     * 获取当前账户余额
     * @return 当前余额（单位：元）
     */
    public double getBalance() {
        return this.balance;
    }

    /**
     * 设置新的账户余额
     * @param balance 新的余额数值（单位：元）
     */
    public void setBalance(double balance) {
        this.balance = balance;
    }

    /**
     * 更新账户状态
     * @param state 新的账户状态对象
     */
    public void setState(AccountState state) {
        this.state = state;
    }

    /**
     * 存款操作
     * @param amount 存款金额（需大于0）
     * 方法流程：
     * 1. 记录存款操作日志
     * 2. 委托当前状态对象处理实际存款逻辑
     * 3. 打印操作后的账户状态信息
     */
    public void deposit(double amount) {
        System.out.println(this.owner + "存款" + amount);
        state.deposit(amount);
        System.out.println("现在余额为" + this.balance);
        System.out.println("现在帐户状态为" + this.state.getClass().getName());
        System.out.println("---------------------------------------------");
    }

    /**
     * 取款操作
     * @param amount 取款金额（需大于0）
     * 方法流程：
     * 1. 记录取款操作日志
     * 2. 委托当前状态对象处理实际取款逻辑
     * 3. 打印操作后的账户状态信息
     */
    public void withdraw(double amount) {
        System.out.println(this.owner + "取款" + amount);
        state.withdraw(amount);
        System.out.println("现在余额为" + this.balance);
        System.out.println("现在帐户状态为" + this.state.getClass().getName());
        System.out.println("---------------------------------------------");
    }

    /**
     * 计算利息操作
     * 根据当前账户状态计算对应的利息
     */
    public void computeInterest() {
        state.computeInterest();
    }
}

